/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MC;

import BE.Frecuencia;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import BE.Turno;
import java.util.*;
/**
 *
 * @author andre
 */
public class AulaTimeTable {
    Integer IdAula;
    HashMap< Integer , List < Turno > > TimeTable ;

    public AulaTimeTable( Integer IdAula ) {
         this.IdAula = IdAula;
         TimeTable = new HashMap<Integer, List<Turno> >();         
    }
    
    public boolean puedeAsignar( Turno T , int F , HashMap< Integer , List< Integer > > LF ){
        List< Integer> LDia = LF.get( F );
        for( Integer I : LDia ) if( !puedeAsignarEnDia( I , T ) ){   
            return false;
        }
        return true;
    }
    
    public void asignaTurno( Turno T , int F  , HashMap< Integer , List< Integer > > LF ){
        List< Integer> LDia = LF.get( F );
        for( Integer I : LDia )
            insertarEnDia( I , T );
    }
    
    void insertarEnDia( Integer idDia , Turno T ){
        List< Turno > lDia = TimeTable.get( idDia );
        if( lDia == null ){
            lDia = new ArrayList<Turno> ();
            TimeTable.put( idDia , lDia );
        }
        Date cur = T.getHoraInicio();
        lDia.add( T );
        int j = lDia.size() - 1;
        while( j > 0 ){        
            Turno prev = lDia.get( j - 1 );
            Date fin = prev.getHoraFin();
            if( fin.compareTo(cur) == 1 ){
                Collections.swap( lDia , j , j - 1 );
            }
            else
                 break;
        }
    }
    
    boolean puedeAsignarEnDia( int idDia , Turno T ){        
        List< Turno > lDia = TimeTable.get( idDia );
        if( lDia == null ){
            lDia = new ArrayList<Turno> ();
            TimeTable.put( idDia , lDia );
        }
        int j = lDia.size() - 1 ;
        Date cur = T.getHoraInicio() , fin = null;        
        if( lDia.isEmpty() )  return true;        
        while( j >= 0 ){
            Turno prev = lDia.get( j );
            fin = prev.getHoraFin();            
            if( fin.compareTo( cur ) <= 0  ){
                if( j == lDia.size() - 1 )  return true;
                Date inicio = lDia.get( j + 1 ).getHoraInicio();
                fin = T.getHoraFin();
                return inicio.compareTo( fin ) >= 0 ;
            }
            j--;
        }                
        Date inicio = lDia.get( 0 ).getHoraInicio();
        return inicio.compareTo( T.getHoraFin() ) >= 0 ;
    }
    
    public Integer getIdAula() {
        return IdAula;
    }
    
}
